package com.wsm.springai.studydemo2.redis;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import redis.clients.jedis.Jedis;

import java.time.LocalTime;
import java.util.List;

public class RegistrationQueue {
    private static final String QUEUE_KEY = "patient_queue";
    private static final ObjectMapper mapper = new ObjectMapper();

    /**
     * 患者签到（入队）
     */
    /**
     * 患者签到（带去重）
     */
    public boolean signIn(Patient patient) {
        Jedis jedis = RedisUtil.getJedis();
        try {
            String patientId = patient.getName(); // 建议使用唯一ID，如身份证号、挂号ID
            String queueKey = "patient_queue";
            String setKey = "patient_sign_set";

            // STEP 1: 检查是否已签到（使用 Set 查询）
            if (jedis.sismember(setKey, patientId)) {
                System.out.println("⚠️  患者 " + patient.getName() + " 已签到，请勿重复签到！");
                return false;
            }

            // STEP 2: 设置签到时间
            patient.setSignTime(LocalTime.now().toString());

            // STEP 3: 序列化患者信息
            String patientJson = mapper.writeValueAsString(patient);

            // STEP 4: 双写：List 和 Set
            jedis.lpush(queueKey, patientJson);           // 入队（List）
            jedis.sadd(setKey, patientId);                // 标记已签到（Set）

            System.out.println("✅ 患者 " + patient.getName() + " 签到成功！签到时间：" + patient.getSignTime());
            return true;

        } catch (JsonProcessingException e) {
            System.err.println("JSON 序列化失败：" + e.getMessage());
            return false;
        } finally {
            RedisUtil.close(jedis);
        }
    }

    /**
     * 叫号（出队）
     * @return 被叫号的患者信息
     */
    /**
     * 叫号（出队）
     */
    public Patient callNext() {
        Jedis jedis = RedisUtil.getJedis();
        try {
            String queueKey = "patient_queue";
            String setKey = "patient_sign_set";

            String patientJson = jedis.rpop(queueKey);
            if (patientJson == null) {
                System.out.println("📢 队列为空，暂无患者。");
                return null;
            }

            Patient patient = mapper.readValue(patientJson, Patient.class);

            // ⚠️ 叫号后，从 Set 中移除，允许下次签到
            jedis.srem(setKey, patient.getName());

            System.out.println("🔊 请 " + patient.getName() + " 到 " + patient.getDepartment() + " 就诊！");
            return patient;
        } catch (Exception e) {
            System.err.println("叫号失败：" + e.getMessage());
            return null;
        } finally {
            RedisUtil.close(jedis);
        }
    }

    /**
     * 查看当前排队列表（从最早到最晚）
     */
    public void showQueue() {
        Jedis jedis = RedisUtil.getJedis();
        try {
            // LRANGE 获取全部元素，0 表示第一个，-1 表示最后一个
            List<String> patients = jedis.lrange(QUEUE_KEY, 0, -1);
            if (patients.isEmpty()) {
                System.out.println("当前排队队列为空。");
                return;
            }

            System.out.println("当前排队队列（从最早签到开始）：");
            // 逆序输出，因为 LPUSH 是从左边插入，所以最晚签到的在最前
            for (int i = patients.size() - 1; i >= 0; i--) {
                try {
                    Patient p = mapper.readValue(patients.get(i), Patient.class);
                    System.out.println((patients.size() - i) + ". " + p.getName() +
                            " (" + p.getDepartment() + ") - " + p.getSignTime());
                } catch (Exception e) {
                    System.err.println("解析患者数据失败：" + e.getMessage());
                }
            }
        } finally {
            RedisUtil.close(jedis);
        }
    }

    /**
     * 获取当前排队人数
     */
    public long getQueueSize() {
        Jedis jedis = RedisUtil.getJedis();
        try {
            return jedis.llen(QUEUE_KEY);
        } finally {
            RedisUtil.close(jedis);
        }
    }
}
